/*     */ package dm.jdbc.driver;
/*     */ 
/*     */ import dm.jdbc.dbaccess.DBError;
/*     */ import dm.jdbc.dbaccess.DbAccess;
/*     */ import dm.jdbc.desc.DmServerInfo;
/*     */ import dm.jdbc.desc.GlobalControlCfg;
/*     */ import java.io.IOException;
/*     */ import java.net.UnknownHostException;
/*     */ import java.sql.SQLException;
/*     */ import java.util.ArrayList;
/*     */ import java.util.Properties;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class DmdbSwitch
/*     */ {
/*  26 */   private DmdbConnection_bs m_conn = null;
/*     */   
/*     */   public DmdbSwitch(DmdbConnection_bs conn) {
/*  29 */     this.m_conn = conn;
/*     */   }
/*     */   
/*     */   public void close() {
/*  33 */     this.m_conn = null;
/*     */   }
/*     */   
/*     */   private void svrSwitchTo(DmServerInfo servInfo)
/*     */     throws UnknownHostException, IOException, SQLException
/*     */   {
/*  39 */     this.m_conn.setHostName(servInfo.getSvrName());
/*  40 */     if (servInfo.hasPort()) {
/*  41 */       this.m_conn.setHostPort(servInfo.getSvrPort());
/*     */     } else {
/*  43 */       this.m_conn.setHostPort(Integer.valueOf(
/*  44 */         this.m_conn.getProperties().getProperty("port", "5236"))
/*  45 */         .intValue());
/*     */     }
/*     */     
/*  48 */     setSocketInfo();
/*  49 */     DmdbCSI.connToServerTry(this.m_conn, true);
/*     */   }
/*     */   
/*     */   public boolean hasOneSvr() {
/*  53 */     return this.m_conn.hasOneSvr();
/*     */   }
/*     */   
/*     */   private void setSocketInfo() throws UnknownHostException, IOException {
/*  57 */     DbAccess dbaccess = new DbAccess(this.m_conn);
/*  58 */     dbaccess.setSoTimeout(this.m_conn.getSocketTimeout());
/*  59 */     this.m_conn.setDbAccess(dbaccess);
/*  60 */     this.m_conn.setNetworkPacketSize(dbaccess.getNetPacketSize());
/*     */   }
/*     */   
/*     */   void loginSuccSwitch() throws SQLException
/*     */   {
/*  65 */     ArrayList servList = this.m_conn.getHosts();
/*  66 */     int curSvr = this.m_conn.getServPos();
/*  67 */     int stat1 = svrStatModeChk();
/*  68 */     if (!needSwitch(stat1)) {
/*  69 */       return;
/*     */     }
/*  71 */     int nextSvr = curSvr + 1;
/*  72 */     int dstSvr = curSvr;
/*  73 */     int stat2 = Integer.MAX_VALUE;
/*  74 */     for (int i = 0; i < servList.size() - 1; i++) {
/*  75 */       if (nextSvr == servList.size()) {
/*  76 */         nextSvr = 0;
/*     */       }
/*     */       try {
/*  79 */         this.m_conn.closeSimple();
/*  80 */         svrSwitchTo((DmServerInfo)servList.get(nextSvr));
/*  81 */         this.m_conn.resetCloseFlag();
/*     */         
/*  83 */         stat2 = svrStatModeChk();
/*  84 */         if (!needSwitch(stat2)) {
/*  85 */           this.m_conn.setServPos(nextSvr);
/*  86 */           return;
/*     */         }
/*     */         
/*  89 */         if (getDestSvr(stat1, stat2) == 2) {
/*  90 */           dstSvr = nextSvr;
/*  91 */           stat1 = stat2;
/*     */         }
/*     */       }
/*     */       catch (IOException localIOException1) {}
/*     */       
/*     */ 
/*  97 */       nextSvr++;
/*     */     }
/*     */     
/* 100 */     if (GlobalControlCfg.getLoginPrimary()) {
/* 101 */       this.m_conn.closeSimple();
/* 102 */       DBError.throwSQLException(6001);
/*     */     }
/*     */     
/*     */ 
/* 106 */     if (dstSvr == nextSvr - 1) {
/* 107 */       this.m_conn.setServPos(dstSvr);
/* 108 */       return;
/*     */     }
/*     */     try
/*     */     {
/* 112 */       this.m_conn.closeSimple();
/* 113 */       svrSwitchTo((DmServerInfo)servList.get(dstSvr));
/* 114 */       this.m_conn.resetCloseFlag();
/*     */     } catch (IOException ioex) {
/* 116 */       DBError.throwSQLException(6001);
/*     */     }
/*     */     
/* 119 */     this.m_conn.setServPos(dstSvr);
/*     */   }
/*     */   
/*     */   void loginFailedSwitch() throws SQLException {
/* 123 */     ArrayList servList = this.m_conn.getHosts();
/* 124 */     int curSvr = this.m_conn.getServPos();
/*     */     
/*     */ 
/* 127 */     int nextSvr = curSvr + 1;
/* 128 */     for (int i = 0; i < servList.size(); i++) {
/* 129 */       if (nextSvr == servList.size()) {
/* 130 */         nextSvr = 0;
/*     */       }
/*     */       try {
/* 133 */         svrSwitchTo((DmServerInfo)servList.get(nextSvr));
/* 134 */         this.m_conn.setServPos(nextSvr);
/*     */         
/*     */ 
/* 137 */         loginSuccSwitch();
/*     */       }
/*     */       catch (IOException ioex) {
/* 140 */         if (i == servList.size() - 1) {
/* 141 */           DBError.throwSQLException(6001);
/*     */         }
/*     */       }
/* 144 */       nextSvr++;
/*     */     }
/*     */   }
/*     */   
/*     */   private int svrStatModeChk()
/*     */   {
/* 150 */     int svrStat = this.m_conn.getSvrStat();
/* 151 */     int svrMode = this.m_conn.getSvrMode();
/*     */     
/* 153 */     switch (svrStat) {
/*     */     case 5: 
/* 155 */       if (svrMode == 1)
/* 156 */         return 1;
/* 157 */       if (svrMode == 2) {
/* 158 */         return 2;
/*     */       }
/* 160 */       return 3;
/*     */     
/*     */     case 3: 
/* 163 */       if (svrMode == 1)
/* 164 */         return 4;
/* 165 */       if (svrMode == 2) {
/* 166 */         return 5;
/*     */       }
/* 168 */       return 6;
/*     */     
/*     */     case 4: 
/* 171 */       if (svrMode == 1)
/* 172 */         return 7;
/* 173 */       if (svrMode == 2) {
/* 174 */         return 8;
/*     */       }
/* 176 */       return 9;
/*     */     }
/*     */     
/*     */     
/*     */ 
/*     */ 
/* 182 */     return 0;
/*     */   }
/*     */   
/*     */   private int getDestSvr(int stat1, int stat2)
/*     */   {
/* 187 */     switch (stat1) {
/*     */     case 1: 
/* 189 */       switch (stat2) {
/*     */       case 1: 
/*     */       case 3: 
/*     */       case 6: 
/*     */       case 7: 
/*     */       case 9: 
/*     */       case 2147483647: 
/* 196 */         return 2;
/*     */       case 4: 
/*     */       case 5: 
/*     */       case 8: 
/* 200 */         return Integer.MIN_VALUE;
/*     */       }
/* 202 */       break;
/*     */     case 4: 
/* 204 */       switch (stat2) {
/*     */       case 1: 
/*     */       case 5: 
/*     */       case 8: 
/* 208 */         return 1;
/*     */       case 3: 
/*     */       case 4: 
/*     */       case 6: 
/*     */       case 7: 
/*     */       case 9: 
/*     */       case 2147483647: 
/* 215 */         return 2;
/*     */       }
/* 217 */       break;
/*     */     case 7: 
/* 219 */       return 1;
/*     */     case 5: 
/* 221 */       return 2;
/*     */     case 8: 
/* 223 */       switch (stat2) {
/*     */       case 1: 
/*     */       case 3: 
/*     */       case 4: 
/*     */       case 6: 
/*     */       case 7: 
/*     */       case 8: 
/*     */       case 9: 
/*     */       case 2147483647: 
/* 232 */         return 2;
/*     */       case 5: 
/* 234 */         return 1;
/*     */       }
/* 236 */       break;
/*     */     case 3: 
/*     */     case 6: 
/*     */     case 9: 
/* 240 */       return 1;
/*     */     }
/*     */     
/* 243 */     return 0;
/*     */   }
/*     */   
/*     */   public void doSwitch() throws SQLException, IOException {
/* 247 */     ArrayList servList = this.m_conn.getHosts();
/* 248 */     int curSvr = this.m_conn.getServPos();
/*     */     
/*     */ 
/* 251 */     int nextSvr = curSvr + 1;
/* 252 */     long times = GlobalControlCfg.getSwitchTimes() * servList.size();
/* 253 */     for (int i = 0; i < times; nextSvr++) {
/* 254 */       if (nextSvr == servList.size()) {
/* 255 */         nextSvr = 0;
/*     */       }
/*     */       try {
/* 258 */         Thread.sleep(GlobalControlCfg.getSwitchInterv());
/*     */         
/* 260 */         this.m_conn.closeSimple();
/* 261 */         svrSwitchTo((DmServerInfo)servList.get(nextSvr));
/* 262 */         this.m_conn.resetCloseFlag();
/*     */         
/*     */ 
/* 265 */         int svrStat = svrStatModeChk();
/* 266 */         if (!needSwitch(svrStat)) {
/* 267 */           this.m_conn.setServPos(nextSvr);
/*     */         }
/*     */       }
/*     */       catch (IOException ex) {
/* 271 */         if (i == times - 1L)
/* 272 */           throw ex;
/*     */       } catch (InterruptedException e) {
/* 274 */         throw new IOException();
/*     */       }
/* 253 */       i++;
/*     */     }
/*     */     
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/* 278 */     int svrStat = svrStatModeChk();
/* 279 */     if (needSwitch(svrStat)) {
/* 280 */       this.m_conn.closeSimple();
/* 281 */       DBError.throwSQLException(20001);
/*     */     } else {
/* 283 */       DmdbCSI.connToStandby(this.m_conn);
/*     */     }
/*     */   }
/*     */   
/*     */   private boolean needSwitch(int stat) {
/* 288 */     if ((7 == stat) || (3 == stat) || 
/* 289 */       (6 == stat) || 
/* 290 */       (9 == stat)) {
/* 291 */       return false;
/*     */     }
/* 293 */     return true;
/*     */   }
/*     */ }


/* Location:              D:\Program Files\DBMS_20150813\jdbc\Dm7JdbcDriver17.jar!\dm\jdbc\driver\DmdbSwitch.class
 * Java compiler version: 2 (46.0)
 * JD-Core Version:       0.7.1
 */